/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package educar.abmUsuario;

import educar.controllers.PrincipalController;
import educar.db.JPA;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;

/**
 *Esta clase funciona como mediador (escuchador), resepta(captura) los eventos de acciones,
 * de mouse y de ventana, esta clase se comunica con las clases EliminarUserController,
 * ModificarUserController y AgregarUserController, la clase UserController es 
 * invocada por la clase principal del sistema, la PrincipalController.
 * @author Flubber
 */
public class UserController implements ActionListener,MouseListener, WindowListener {
  
    //Atributo usado para crear una instacia de la clase principal del sistema
    private PrincipalController principalController;
    
    //Atributo usado para crer una vista de usuario (ventana)
    private UserView userView;

// <editor-fold defaultstate="collapsed" desc="Constructor">
    /**
     * <hr>
     * UserController(): Constructor de la clase UserController
     * <hr>
     * @param principalControl 
     */
    public UserController(PrincipalController principalControl){ 
        principalController = principalControl;
        userView = new UserView();
        userView.setActionListener(this);
        userView.setMouseListener(this);
        userView.setWindowListener(this);
    }
 // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Action setView">    
    /**
     * <hr>
     * setView(): Hace visible a una ventana de usuario.
     * <hr>
     */    
    public void setView() {
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = 0;
        int y = 50;
        userView.setBounds(x, y, screen.width, (screen.height)-90);
        userView.setModeloTabla(listarUser());
        userView.setVisible(true);
    }
// </editor-fold>    

// <editor-fold defaultstate="collapsed" desc="Metodos ActionPermormed">    
    /**
     * <hr>
     * actionPerformed():metodo que recibe un evento de un boton y dependiendo de
     * este este evento puede eliminar, agregar o buscar un usuario.
     * <hr>
     * @param e 
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //Atributo usado para verificar procedencia (boton)        
        Object source = e.getSource();
        if (userView.getJbAgregar() == source) {    //Boton Agregar
                AgregarUserController agregarUserController = new AgregarUserController(this);
                agregarUserController.setView();
        }
        
        if (userView.getJbEliminar() == source) {   //Boton Eliminar 
            EliminarUserController eliminarUserController = new EliminarUserController();
            eliminarUserController.eliminarRegistro(userView.getModeloTabla());
        }    
        
        if (userView.getJbBuscar() == source) {  //Boton Buscar
            userView.setModeloTabla(null);
            if (userView.getCriterio().isEmpty()){
                userView.setModeloTabla(listarUser());
            }else{  
                userView.setModeloTabla(buscarUser(userView.getCriterio()));
            }
        }       
    }//Fin del metodo actionPerformed()
    
    /**
     * <hr>
     * mouseClicked(): Metodo usado para detectar el evento del mouse en la ventana de usuario
     * <hr>
     * @param e 
     */
    @Override
    public void mouseClicked(MouseEvent e) {
        //Atributo usado para verificar procedencia (boton)        
        Object source = e.getSource();
        if ((userView.getJTUsuario() == source) && (e.getClickCount()==2)) {    //Tabla Usuario y Clickeado dos veces
            ModificarUserController modificarUserController = new ModificarUserController(this);
            int fila = userView.getJTUsuario().getSelectedRow();
            Vector registro = (Vector) (userView.getModeloTabla().getDataVector()).elementAt(fila);
            modificarUserController.setView(registro, fila);
        }    
    }//Fin del metodo mouseClicked()
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Metodos auxiliares usados">    
    /**
     * <hr>
     * AgregarATabla(): Agrega a la tabla de la ventana un elemento
     * <hr>
     * @param item elemento a agregar
     */
    public void agregarATabla(String[] item){
        Object[] vector = new Object[4];
        vector[0] = (boolean) false;
        for (int i = 1; i < 4; i++){
            vector[i] = item[i-1];
        }
        userView.getModeloTabla().addRow(vector);
    }//Fin del metodo agregarATabla(String[])

    
    /**
     * <hr>
     * actualizarFila(): Modifica los atrubitos de un elemento de la tabla
     * <hr>
     * @param item elemento modificado
     * @param fila <code>int</code> con la fila en onde se encuentra el elemento a modificar
     */    
    public void actualizarFila(String[] item, int fila){
        userView.getModeloTabla().setValueAt(false, fila, 0);
        for (int i = 1; i < 4; i++){
            userView.getModeloTabla().setValueAt(item[i-1], fila, i);
        }
    }//Fin del metodo actualizarFila(String[], int)
    
    
    /**
     * <hr>
     * ListarUser(): Lista todas los usuarios de la base de datos en la tabla
     * <hr>
     * @return DefaultTableModel la tabla con todos los usuarios
     */
    public DefaultTableModel listarUser() {
        JPA jpa = new JPA();
        Object[] vector = new Object[4];
        DefaultTableModel tabla = (DefaultTableModel) userView.getJTUsuario().getModel(); 
        ResultSet res = jpa.showAll("users");
        try {
            while (res.next()) {
                vector[0] = false;
                vector[1] = res.getObject(2);
                vector[2] = res.getObject(3);
                vector[3] = res.getObject(4); 
                tabla.addRow(vector);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return tabla;
    }//Fin del metodo listarUser()
    
        
    /**
     * <hr>
     * Lista todas los usuario que tiene como nombre de usuario usernameCriterio.
     * <hr>
     * @param usernameCriterio: es el username del usuario a buscar
     * @return DefaultTableModel la tabla con todos los usuarios que cumplen con dicha propiedad
     */
    public DefaultTableModel buscarUser(String usernameCriterio) {
            JPA jpa = new JPA();
            Object[] vector = new Object[4];
            DefaultTableModel tabla = (DefaultTableModel) userView.getModeloTabla(); 
            ResultSet res = jpa.showLike("users", "username", usernameCriterio);
            try {
                while (res.next()) {    //Existe siguiente registro.
                    vector[0] = false;
                    vector[1] = res.getObject(2);
                    vector[2] = res.getObject(3);
                    vector[3] = res.getObject(4); 
                    tabla.addRow(vector);
                }
            } catch (SQLException ex) { //No existe siguiente registro.
                ex.printStackTrace();
            }
            return tabla;       
    }//Fin del metodo buscarUser()
        
    
    /**
     * <hr>
     * windowClosing():metodo que recibe un evento de una ventana y dependiendo de
     * este evento realiza las operaciones necesarias.
     * <hr>
     * @param e 
     */    
    @Override
    public void windowClosing(WindowEvent e) {
            principalController.setView();
    }//Fin del metodo windowClosing()
    
// </editor-fold>    
    
// <editor-fold defaultstate="collapsed" desc="Metodos ActionPerformed no usadas"> 
    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void windowOpened(WindowEvent e) {

    }

    @Override
    public void windowClosed(WindowEvent e) {

    }

    @Override
    public void windowIconified(WindowEvent e) {

    }

    @Override
    public void windowDeiconified(WindowEvent e) {

    }

    @Override
    public void windowActivated(WindowEvent e) {

    }

    @Override
    public void windowDeactivated(WindowEvent e) {

    }
// </editor-fold>    
    
}//Fin de la clase UserController
